 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
  -->
<html>
<head>
<title>Developers guide for Apache Commons "Collections" Package</title>
</head>
<body>

<div>
<h1>The Apache Commons <em>Collections</em> Package</h1>
<h2>Developer's Guide</h2>
<ol>
  <li><a href="#Introduction">Introduction</a></li>
  <li><a href="#CollectionInterfaces">Collection Interfaces</a></li>
  <li><a href="#CollectionImplementations">Collection Implementations</a></li>
  <li><a href="#UtilityClasses">Utility Classes</a></li>
  <li><a href="#CodingStandards">Coding Standards</a></li>
</ol>
</div>

<a id="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>The <em>Collections</em> package contains a set of Java classes that extend
or augment the Java Collections Framework. This developers guide seeks to set
out rules for the naming of classes and methods within the package. The purpose
of this, as with all naming standards, is to improve the coherency and
consistency of the whole API.</p>

<p>The philosophy of the naming standards is to follow those of
java.util.Collections.</p>


<a id="CollectionInterfaces"></a>
<h3>2.  COLLECTION INTERFACES</h3>

<p>Collection interfaces are new types of collections not included in Java.
Examples include <code>Bag</code> and <code>SortedBag</code>. These interfaces
shall:</p>
<ul>
<li>be top level interfaces</li>
<li>have a name that describes their purpose</li>
</ul>


<a id="CollectionImplementations"></a>
<h3>3.  COLLECTION IMPLEMENTATIONS</h3>

<p>Collection implementation are new implementations of collection interfaces.
Examples include <code>DoubleOrderedMap</code> and <code>DefaultMapBag</code>.
These interfaces shall:</p>
<ul>
<li>be top level classes</li>
<li>have a name that ends with the collection type being implemented</li>
<li>have a name that describes their implementation</li>
<li>contain no public inner classes</li>
<li>only contain the collection implementation, and any methods specific to
that implementation</li>
</ul>


<a id="UtilityClasses"></a>
<h3>4.  UTILITY CLASSES</h3>

<p>Utility classes provide additional functionality around an interface and
its basic implementations. Examples include CollectionUtils and ListUtils.</p>

<p>Each class shall follow the naming pattern XxxUtils where Xxx relates to the
object being returned by the class, for example <code>ListUtils</code> and
<code>BagUtils</code>. Variations on a theme (<code>SortedBag</code> as opposed
to <code>Bag</code>) will be dealt with in one Utils class. Each Utils class
shall:</p>

<ul>
<li>be a single, static method based, class</li>
<li>have a name consisting of the interface name plus 'Utils'</li>
<li>deal with one collection interface and its variations</li>
<li>provide methods that decorate the interface with additional
functionality</li>
<li>provide methods that perform useful utility functions on that
interface</li>
</ul>

<p>Where the method in a Utils class is a decorator, the name shall consist of
an adjective followed by the collection type.  Typically, such adjective is
formed by appending an -ed suffix (meaning "having"/"characterized by") to the
word describing the type of decorator.  For example,
<code>synchronizedMap(Map)</code> or <code>predicatedSet(Set)</code>.
Occasionally, such construct is awkward and a more suitable adjective can be
used instead.  For example, <code>lazyList</code>,
<code>unmodifiableList</code>.</p>

<p>These decorators should be implemented either as non-public, static,
inner classes, or as public classes in a subpackage. If a subpackage is used,
the constructors should be protected and a public static decorate() method
provided on each class for construction.</p>

<a id="CodingStandards"></a>
<h3>5. CODING STANDARDS</h3>

<p>Commons Collections follows similar style rules to many other Java open source
projects, and the Sun conventions. Some specific conventions are:</p>

<ul>
<li>No tabs, 4 space indentations</li>
<li>Curly brackets open at line end</li>
<li>Else, catch and finally statements after the closing bracket</li>
<li>Single space after keyword such as if</li>
<li>Two spaces between parameter name and description in @param</li>
<li>Generally copy the style of the surrounding code</li>
</ul>

<p>And remember, the commons-dev mailing list is there for any discussions
or queries about patches or new additions to collections.</p>

</body>
</html>
